home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Screensaver / Ultimate Screen Savers Collection (CMS Distributing) (1996).ISO / saver3 / xwsave1 / kaleid.c < prev    next >
C/C++ Source or Header  |  1995-02-27  |  6KB  |  172 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)kaleid.c       1.98 94/10/04 XLOCK";
  3. #endif
  4. /*
  5.  * kaleid.c
  6.  *
  7.  * Based on a kaleidoscope algorithm from a PC-based program by:
  8.  * Judson D. McClendon (Compuserve: [74415,1003])
  9.  *
  10.  * KALEIDOSCOPE (X11 Version)
  11.  * By Nathan Meyers, nathanm@hp-pcd.hp.com.
  12.  *
  13.  * Modified by Laurent JULLIARD, laurentj@hpgnse2.grenoble.hp.com
  14.  * for LINUX 0.96 and X11 v1.0 shared library
  15.  *
  16.  * Revision History:
  17.  * 23-Oct-94: Ported to xlock by David Bagley <bagleyd@source.asset.com>
  18. */
  19.  
  20.  
  21. #include <stdlib.h>
  22. #include "xlock.h"
  23.  
  24. #define INTRAND(min,max) (random()%((max+1)-(min))+(min))
  25.  
  26.  
  27. typedef struct {
  28.     int         x;
  29.     int         y;
  30. }           point;
  31.  
  32. typedef struct {
  33.     int         pix;
  34.     int         cx, cy, m;
  35.     int         ox, oy;
  36. #ifdef MSWIN                   // PKS.  int and long with 32 bit os are 4,
  37.     long        x1, y1, x2, y2, xv1, yv1, xv2, yv2; // but int is 2 in 16 bit os.
  38.     long        xa, ya, xb, yb, xc, yc, xd, yd;
  39. #else
  40.     int         x1, y1, x2, y2, xv1, yv1, xv2, yv2;
  41.     int         xa, ya, xb, yb, xc, yc, xd, yd;
  42. #endif
  43.     int         width;
  44.     int         height;
  45.     int         itercount;
  46. } kaleidstruct;
  47.  
  48. static kaleidstruct kaleids[MAXSCREENS];
  49.  
  50. void
  51. initkaleid(win)
  52.     Window      win;
  53. {
  54.     XWindowAttributes xgwa;
  55.     kaleidstruct  *kp = &kaleids[screen];
  56.  
  57.     XGetWindowAttributes(dsp, win, &xgwa);
  58.     kp->width = xgwa.width;
  59.     kp->height = xgwa.height;
  60.  
  61.     kp->pix = 0;
  62.     kp->cx = kp->width/2;
  63.     kp->cy = kp->height/2;
  64.     kp->m = (kp->cx>kp->cy) ? kp->cx : kp->cy;
  65.     kp->m = kp->m ? kp->m : 1;
  66.     kp->x1 = random() % kp->m + 1;
  67.     kp->x2 = random() % kp->m + 1;
  68.     kp->y1 = random() % kp->x1 + 1;
  69.     kp->y2 = random() % kp->x2 + 1;
  70.     kp->xv1 = random() % 7 - 3;
  71.     kp->xv2 = random() % 7 - 3;
  72.     kp->yv1 = random() % 7 - 3;
  73.     kp->yv2 = random() % 7 - 3;
  74.     kp->itercount = 0;
  75.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  76.     XFillRectangle(dsp, win, Scr[screen].gc, 0, 0, kp->width, kp->height);
  77. }
  78.  
  79. void
  80. drawkaleid(win)
  81.     Window      win;
  82. {
  83.     XSegment segs[8];
  84.     kaleidstruct  *kp = &kaleids[screen];
  85.  
  86.     if (!(random() % 50)) {
  87.           kp->x1 = random() % kp->m + 1;
  88.           kp->x2 = random() % kp->m + 1;
  89.           kp->y1 = random() % kp->x1;
  90.           kp->y2 = random() % kp->x2;
  91.     }
  92.     if (!(random() % 10)) {
  93.           kp->xv1 = random() % 7 - 3;
  94.           kp->xv2 = random() % 7 - 3;
  95.           kp->yv1 = random() % 7 - 3;
  96.           kp->yv2 = random() % 7 - 3;
  97.           if (!mono && Scr[screen].npixels > 2) {
  98.             XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[kp->pix]);
  99.             if (++kp->pix >= Scr[screen].npixels)
  100.               kp->pix = 0;
  101.           }
  102.     }
  103.     if (kp->cx<kp->cy) {
  104.           kp->xa = kp->x1 * kp->cx / kp->cy;
  105.           kp->ya = kp->y1 * kp->cx / kp->cy;
  106.           kp->xb = kp->x1;
  107.           kp->yb = kp->y1;
  108.           kp->xc = kp->x2 * kp->cx / kp->cy;
  109.           kp->yc = kp->y2 * kp->cx / kp->cy;
  110.           kp->xd = kp->x2;
  111.           kp->yd = kp->y2;
  112.     } else {
  113.           kp->xa = kp->x1;
  114.           kp->ya = kp->y1;
  115.           kp->xb = kp->x1 * kp->cy / kp->cx;
  116.           kp->yb = kp->y1 * kp->cy / kp->cx;
  117.           kp->xc = kp->x2;
  118.           kp->yc = kp->y2;
  119.           kp->xd = kp->x2 * kp->cy / kp->cx;
  120.           kp->yd = kp->y2 * kp->cy / kp->cx;
  121.     }
  122.     segs[0].x1 = kp->cx + kp->xa + kp->ox;
  123.     segs[0].y1 = kp->cy - kp->yb + kp->oy;
  124.     segs[0].x2 = kp->cx + kp->xc + kp->ox;
  125.     segs[0].y2 = kp->cy - kp->yd + kp->oy;
  126.     segs[1].x1 = kp->cx - kp->ya + kp->ox;
  127.     segs[1].y1 = kp->cy + kp->xb + kp->oy;
  128.     segs[1].x2 = kp->cx - kp->yc + kp->ox;
  129.     segs[1].y2 = kp->cy + kp->xd + kp->oy;
  130.     segs[2].x1 = kp->cx - kp->xa + kp->ox;
  131.     segs[2].y1 = kp->cy - kp->yb + kp->oy;
  132.     segs[2].x2 = kp->cx - kp->xc + kp->ox;
  133.     segs[2].y2 = kp->cy - kp->yd + kp->oy;
  134.     segs[3].x1 = kp->cx - kp->ya + kp->ox;
  135.     segs[3].y1 = kp->cy - kp->xb + kp->oy;
  136.     segs[3].x2 = kp->cx - kp->yc + kp->ox;
  137.     segs[3].y2 = kp->cy - kp->xd + kp->oy;
  138.     segs[4].x1 = kp->cx - kp->xa + kp->ox;
  139.     segs[4].y1 = kp->cy + kp->yb + kp->oy;
  140.     segs[4].x2 = kp->cx - kp->xc + kp->ox;
  141.     segs[4].y2 = kp->cy + kp->yd + kp->oy;
  142.     segs[5].x1 = kp->cx + kp->ya + kp->ox;
  143.     segs[5].y1 = kp->cy - kp->xb + kp->oy;
  144.     segs[5].x2 = kp->cx + kp->yc + kp->ox;
  145.     segs[5].y2 = kp->cy - kp->xd + kp->oy;
  146.     segs[6].x1 = kp->cx + kp->xa + kp->ox;
  147.     segs[6].y1 = kp->cy + kp->yb + kp->oy;
  148.     segs[6].x2 = kp->cx + kp->xc + kp->ox;
  149.     segs[6].y2 = kp->cy + kp->yd + kp->oy;
  150.     segs[7].x1 = kp->cx + kp->ya + kp->ox;
  151.     segs[7].y1 = kp->cy + kp->xb + kp->oy;
  152.     segs[7].x2 = kp->cx + kp->yc + kp->ox;
  153.     segs[7].y2 = kp->cy + kp->xd + kp->oy;
  154.     XDrawSegments(dsp, win, Scr[screen].gc, segs, 8);
  155.     kp->x1= (kp->x1 + kp->xv1) % kp->m;
  156.     kp->y1= (kp->y1 + kp->yv1) % kp->m;
  157.     kp->x2= (kp->x2 + kp->xv2) % kp->m;
  158.     kp->y2= (kp->y2 + kp->yv2) % kp->m;
  159.     kp->itercount++;
  160.  
  161.     if (kp->itercount > 500 && !(random() % 700)) {
  162.     XClearWindow(dsp, win);
  163.         kp->itercount = 0;
  164.     }
  165.     if (!mono && Scr[screen].npixels > 2) {
  166.         XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[kp->pix]);
  167.         if (++kp->pix >= Scr[screen].npixels)
  168.             kp->pix = 0;
  169.     } else
  170.         XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
  171. }
  172.